home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 July / EnigmA AMIGA RUN 20 (1997)(G.R. Edizioni)(IT)[!][issue 1997-07 & 08][EAR-CD IV].iso / earcd / text / misc / nroff.lha / nroff / io.c < prev    next >
C/C++ Source or Header  |  1997-01-24  |  4KB  |  278 lines

  1. /*
  2.  *    io.c - low level I/O processing portion of nroff word processor
  3.  *
  4.  *    adapted for atariST/TOS by Bill Rosenkranz 11/89
  5.  *    net:    rosenkra@hall.cray.com
  6.  *    CIS:    71460,17
  7.  *    GENIE:    W.ROSENKRANZ
  8.  *
  9.  *    original author:
  10.  *
  11.  *    Stephen L. Browning
  12.  *    5723 North Parker Avenue
  13.  *    Indianapolis, Indiana 46220
  14.  *
  15.  *    history:
  16.  *
  17.  *    - Originally written in BDS C;
  18.  *    - Adapted for standard C by W. N. Paul
  19.  *    - Heavily hacked up to conform to "real" nroff by Bill Rosenkranz
  20.  */
  21.  
  22. #undef NRO_MAIN                    /* extern globals */
  23.  
  24. #include <stdio.h>
  25. #include "nroff.h"
  26.  
  27. /*------------------------------*/
  28. /*    getlin            */
  29. /*------------------------------*/
  30. getlin (p, in_buf)
  31. char   *p;
  32. FILE   *in_buf;
  33. {
  34.  
  35. /*
  36.  *    retrieve one line of input text
  37.  */
  38.  
  39.     register char  *q;
  40.     register int    i;
  41.     int        c;
  42.     int        nreg;
  43.  
  44.     q = p;
  45.     for (i = 0; i < MAXLINE - 1; ++i)
  46.     {
  47.         c = ngetc (in_buf);
  48.         if (c == EOF)
  49.         {
  50.             *q = EOS;
  51.             c  = strlen (p);
  52.             return (c == 0 ? EOF : c);
  53.         }
  54.         *q++ = c;
  55.         if (c == '\n')
  56.             break;
  57.     }
  58.     *q = EOS;
  59.  
  60.     nreg = findreg (".c");
  61.     if (nreg > 0)
  62.         set_ireg (".c", rg[nreg].rval + 1, 0);
  63.  
  64.     return (strlen (p));
  65. }
  66.  
  67.  
  68.  
  69.  
  70.  
  71.  
  72. /*------------------------------*/
  73. /*    ngetc            */
  74. /*------------------------------*/
  75. ngetc (infp)
  76. FILE   *infp;
  77. {
  78.  
  79. /*
  80.  *    get character from input file or push back buffer
  81.  */
  82.  
  83.     register int    c;
  84.  
  85.     if (mac.ppb >= &mac.pbb[0])
  86.         c = *mac.ppb--;
  87.     else
  88.         c = getc (infp);
  89.  
  90.     return (c);
  91. }
  92.  
  93.  
  94.  
  95. /*------------------------------*/
  96. /*    pbstr            */
  97. /*------------------------------*/
  98. pbstr (p)
  99. char   *p;
  100. {
  101.  
  102. /*
  103.  *    Push back string into input stream
  104.  */
  105.  
  106.     register int    i;
  107.  
  108.     /*
  109.      *   if string is null, we do nothing
  110.      */
  111.     if (p == NULL_CPTR)
  112.         return;
  113.     if (p[0] == EOS)
  114.         return;
  115.     for (i = strlen (p) - 1; i >= 0; --i)
  116.     {
  117.         putbak (p[i]);
  118.     }
  119. }
  120.  
  121.  
  122.  
  123.  
  124.  
  125. /*------------------------------*/
  126. /*    putbak            */
  127. /*------------------------------*/
  128. putbak (c)
  129. char    c;
  130. {
  131.  
  132. /*
  133.  *    Push character back into input stream. we use the push-back buffer
  134.  *    stored with macros.
  135.  */
  136.  
  137.     if (mac.ppb < &(mac.pbb[0]))
  138.     {
  139.         mac.ppb = &(mac.pbb[0]);
  140.         *mac.ppb = c;
  141.     }
  142.     else
  143.     {
  144.         if (mac.ppb >= &mac.pbb[MAXPBB - 1])
  145.         {
  146.             fprintf (err_stream,
  147.                 "***%s: push back buffer overflow\n", myname);
  148.             err_exit (-1);
  149.         }
  150.         *++(mac.ppb) = c;
  151.     }
  152. }
  153.  
  154.  
  155.  
  156. /*------------------------------*/
  157. /*    prchar            */
  158. /*------------------------------*/
  159. prchar (c, fp)
  160. char    c;
  161. FILE   *fp;
  162. {
  163.  
  164. /*
  165.  *    print character with test for printer
  166.  */
  167.  
  168. /* this really slows things down. it should be fixed. for now, ignore
  169.    line printer...
  170.  
  171.     if (fp == stdout)
  172.         putc (c, fp);
  173.     else
  174.         putc_lpr (c, fp);
  175. */
  176.     putc (c, fp);
  177. }
  178.  
  179.  
  180.  
  181.  
  182.  
  183.  
  184. /*------------------------------*/
  185. /*    put            */
  186. /*------------------------------*/
  187. put (p)
  188. char   *p;
  189. {
  190.  
  191. /*
  192.  *    put out line with proper spacing and indenting
  193.  */
  194.  
  195.     register int    j;
  196.     char        os[MAXLINE];
  197.  
  198.     if (pg.lineno == 0 || pg.lineno > pg.bottom)
  199.     {
  200.         phead ();
  201.     }
  202.     if (dc.prflg == TRUE)
  203.     {
  204.         if (!dc.bsflg)
  205.         {
  206.             if (strkovr (p, os) == TRUE)
  207.             {
  208.                 for (j = 0; j < pg.offset; ++j)
  209.                     prchar (' ', out_stream);
  210.                 for (j = 0; j < dc.tival; ++j)
  211.                     prchar (' ', out_stream);
  212.                 putlin (os, out_stream);
  213.             }
  214.         }
  215.         for (j = 0; j < pg.offset; ++j)
  216.             prchar (' ', out_stream);
  217.         for (j = 0; j < dc.tival; ++j)
  218.             prchar (' ', out_stream);
  219.         putlin (p, out_stream);
  220.     }
  221.     dc.tival = dc.inval;
  222.     skip (min (dc.lsval - 1, pg.bottom - pg.lineno));
  223.     pg.lineno = pg.lineno + dc.lsval;
  224.     set_ireg ("ln", pg.lineno, 0);
  225.     if (pg.lineno > pg.bottom)
  226.     {
  227.         pfoot ();
  228.         if (stepping)
  229.             wait_for_char ();
  230.     }
  231. }
  232.  
  233.  
  234.  
  235.  
  236. /*------------------------------*/
  237. /*    putlin            */
  238. /*------------------------------*/
  239. putlin (p, pbuf)
  240. register char  *p;
  241. FILE           *pbuf;
  242. {
  243.  
  244. /*
  245.  *    output a null terminated string to the file
  246.  *    specified by pbuf.
  247.  */
  248.  
  249.     while (*p != EOS)
  250.         prchar (*p++, pbuf);
  251. }
  252.  
  253.  
  254.  
  255.  
  256. /*------------------------------*/
  257. /*    putc_lpr        */
  258. /*------------------------------*/
  259. #ifdef GEMDOS
  260. #include <osbind.h>
  261. #endif
  262.  
  263. putc_lpr (c, fp)
  264. char    c;
  265. FILE   *fp;
  266. {
  267.  
  268. /*
  269.  *    write char to printer
  270.  */
  271.  
  272. #ifdef GEMDOS
  273.     Bconout (0, (int) c & 0x00FF);
  274. #else
  275.     putc (c, fp);
  276. #endif
  277. }
  278.